package com.atguigu0.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @description: xxx
 * @time: 2020/6/15 11:10
 * @author: baojinlong
 **/
object CustomerAccumulationTest {
  def main(args: Array[String]): Unit = {
    val sparkConf: SparkConf = new SparkConf().setAppName("myWordCount").setMaster("local[*]")
    // 创建sparkContext对象,转换操作是懒执行的,并不会马上触发job
    val sc: SparkContext = new SparkContext(sparkConf)
    // 定义一个变量
    val sum = new CustomerAccumulation
    // 注册自定义累加器
    sc.register(sum, "sum")
    val numRDD: RDD[Int] = sc.parallelize(Array(1, 2, 3, 4), 2)
    // 注意累加器最好放在行动算子中统计,只统计一次,转换算子会存在重试机制,另外必须有行动算子才会触发累加
    val value: RDD[(Int, Int)] = numRDD.map(x => {
      sum.add(x)
      (x, 1)
    })
    // 需要触发一次行动算子,如果没有下面代码则不会sum.value=0
    value.foreach(println)
    //    numRDD.foreach(x => {
    //      sum.add(x)
    //    })
    println("计算结果" + sum.value)
    // 关闭连接
    sc.stop()
  }
}
